package org.example.study4;

/**
 * 使用静态全局对象做为锁对象
 * 展示了通过静态锁对象保护静态变量 的线程安全机制。
 * Counter408 类的 locker 是静态变量，所有实例共享同一锁对象，确保多个线程对静态变量 count 的累加操作同步执行，
 */
public class Demo_408 {
    public static void main(String[] args) throws InterruptedException {
        // 初始化两个不同的 Counter408 实例
        Counter408 counter = new Counter408(); // 实例1
        Counter408 counter1 = new Counter408(); // 实例2

        // 创建两个线程，分别操作不同的实例
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                counter.increase(); // 线程1调用实例1的 increase()
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                counter1.increase(); // 线程2调用实例2的 increase()
            }
        });

        // 启动线程
        t1.start(); // 线程1操作实例1
        t2.start(); // 线程2操作实例2

        // 等待线程结束
        t1.join();
        t2.join();

        // 输出结果（必为 10 万）
        System.out.println("count = " + counter.count);
    }
}
class Counter408 {
    public static int count = 0; // 静态变量，类级别共享

    // 静态锁对象（所有实例共享同一锁）
    static Object locker = new Object(); // 静态变量，属于类

    /**
     * 累加方法（使用静态锁对象同步）
     */
    public void increase() {
        synchronized (locker) { // 锁定静态锁对象 locker
            count++; // 原子操作（在同步保护下）
        }
    }
}

// 运行：count = 100000
/*
1. 静态锁的作用
locker 是静态变量：所有 Counter408 实例共享同一个 locker 对象。
锁的唯一性：无论创建多少个 Counter408 实例，所有线程在调用 increase() 时都竞争同一把锁，确保对静态变量 count 的修改是原子的。

2. 静态变量与静态锁的匹配
静态变量 count：属于类级别，所有实例共享。
静态锁 locker：锁的作用域与变量的作用域一致，保证所有线程通过同一锁同步。*/



/*潜在问题
若锁对象非静态
如果 locker 改为实例变量：

class Counter408 {
    public static int count = 0;
    Object locker = new Object(); // 实例级别锁

    public void increase() {
        synchronized (locker) { // 不同实例的锁不同
            count++;
        }
    }
}
线程不安全：不同实例的线程使用不同的锁，count++ 并发执行。
现象：结果小于 10 万。*/


/*总结
核心改进：通过静态锁对象（static Object locker）确保所有实例的线程使用同一锁，保护静态变量 count 的线程安全。
设计意义：锁的作用域必须与共享变量的作用域一致。静态变量需使用静态锁或类锁。
实际应用：在多实例环境下，若需保护类级别资源（如全局计数器、缓存等），必须使用类级别锁或静态锁。
体现知识点：静态变量的同步机制、锁粒度控制、多实例环境下的线程安全设计。*/